package com.starry.module.system.core.menu.mapper;

import com.starry.core.common.domain.vo.PageVo;
import com.starry.core.tenant.core.aop.TenantIgnore;
import com.starry.db.core.enums.DBEnableDisableStatusEnum;
import com.starry.db.core.mapper.BaseMapperX;
import com.starry.db.core.query.LambdaQueryWrapperX;
import com.starry.module.system.api.menu.domain.qo.SysMenuPageQo;
import com.starry.module.system.api.menu.domain.qo.SysMenuTreeQo;
import com.starry.module.system.api.menu.domain.vo.LoginRouterVo;
import com.starry.module.system.core.menu.entity.SysMenu;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 系统菜单-数据库服务层
 *
 * @author xiaoke
 */
@Mapper
public interface SysMenuMapper extends BaseMapperX<SysMenu> {

    /**
     * 分页查询
     *
     * @param pageQo 分页参数
     * @return PageVo<SysMenu>
     */
    default PageVo<SysMenu> selectPage(SysMenuPageQo pageQo) {
        return selectPage(pageQo, new LambdaQueryWrapperX<SysMenu>()
                .inIfPresent(SysMenu::getPid, pageQo.getPidList())
                .eqIfPresent(SysMenu::getShowLink, pageQo.getShowLink())
                .likeIfPresent(SysMenu::getName, pageQo.getName())
                .eqIfPresent(SysMenu::getStatus, pageQo.getStatus())
                .eqIfPresent(SysMenu::getMenuType, pageQo.getMenuType())
        );
    }


    /**
     * 获取所有菜单权限
     *
     * @return Set<String>
     */
    default Set<String> getAllPerms() {
        return selectList().stream()
                .map(SysMenu::getPerms)
                .collect(Collectors.toSet());
    }


    /**
     * 获取菜单树列表
     *
     * @param treeQo 菜单树参数
     * @return List<SysMenu>
     */
    default List<SysMenu> getTreeMenuList(SysMenuTreeQo treeQo) {
        return selectList(new LambdaQueryWrapperX<SysMenu>()
                .likeIfPresent(SysMenu::getName, treeQo.getName())
                .likeIfPresent(SysMenu::getTitle, treeQo.getTitle())
                .eqIfPresent(SysMenu::getMenuType, treeQo.getMenuType())
                .eqIfPresent(SysMenu::getStatus, treeQo.getStatus())
                .orderByAsc(SysMenu::getMenuRank)
        );
    }

    /**
     * 获取租户菜单树列表
     *
     * @param treeQo 菜单树参数
     * @return List<SysMenu>
     */
    default List<SysMenu> getTreeTenantMenuList(SysMenuTreeQo treeQo, Set<Long> menuIdList) {
        return selectList(new LambdaQueryWrapperX<SysMenu>()
                .in(SysMenu::getId, menuIdList)
                .likeIfPresent(SysMenu::getName, treeQo.getName())
                .likeIfPresent(SysMenu::getTitle, treeQo.getTitle())
                .eqIfPresent(SysMenu::getMenuType, treeQo.getMenuType())
                .eqIfPresent(SysMenu::getStatus, DBEnableDisableStatusEnum.ENABLE.getCode())
                .orderByAsc(SysMenu::getMenuRank)
        );
    }

    /**
     * 根据用户id获取菜单路由
     *
     * @param userId 用户id
     * @return List<LoginRouterVo>
     */
    @TenantIgnore
    List<LoginRouterVo> getByLoginUserMenuRouter(Long userId);
}

